@Sophia
2年前 提问
1个回答

Scapy 怎么定制 ping 包

GQQQy
2年前

Scapy定制ping包,主要包括以下四个阶段:

  • 先抑制scapy导入所出现的报错,然后导入程序中所需要的所有数据包。
from scapy.all import *

from random import randint


def ping_once(host):

    #随机产生一个1-65535IP的id位

    ip_id=randint(1,65535)

    #随机产生一个1-65535的icmp的id位

    icmp_id=randint(1,65535)

    #随机产生一个1-65535的icmp的序列号

    icmp_seq=randint(1,65535)
  • 使用命令铸造数据包
packet=IP(dst=host,ttl=64,id=ip_id)/ICMP(id=icmp_id,seq=icmp_seq)/b'rootkit'
  • 把铸造的数据包进行发送。
   ping=sr1(packet,timeout=2,verbose=False)

    #如果收到回复则代表ping成功,成功就以退出码3退出(便于后续用来判断此进程是否成功)

    if ping:

        os._exit(3)

if __name__ == '__main__':

    ping_once(sys.argv[1])
  • 最后实现ping扫描
#!/usr/bin/python3.4

# _*_ coding=utf-8 _*_

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

import ipaddress

import time

import multiprocessing

from random import randint

from scapy.all import *


#实现ping扫描的函数

def ping_once(host):

    ip_id=randint(1,65535)

    icmp_id=randint(1,65535)

    icmp_seq=randint(1,65535)

    packet=IP(dst=host,ttl=64,id=ip_id)/ICMP(id=icmp_id,seq=icmp_seq)/b'rootkit'

    ping=sr1(packet,timeout=2,verbose=False)

    if ping:

        os._exit(3)


#使用多进程连续调用ping_once函数,实现ping_scan

def ping_scan(network):

    #此模块可以将一个网络转换成一个个ip地址

    net=ipaddress.ip_network(network)

    ip_processes={}

    for ip in net:

        #读取网络中的每一个IP地址,使用str将其转换成字符串

        ip_addr=str(ip)

        #开启多进程,使用ping_once这个函数扫描ip_addr这个地址

        ping=multiprocessing.Process(target=ping_once,args=(ip_addr,))

        #开启这个进程

        ping.start()

        #产生ip与进程对应的字典

        ip_processes[ip_addr]=ping

    ip_list=[]

    for ip,process in ip_addresses.items():

        if process.exitcode==3:

            ip_list.append(ip)

        else:

            process.terminate()

     return sorted(ip_list)


if __name__ == '__main__':

    import time

    t1=time.time()

    active_ip=ping_scan(sys/argv[1])

    print("活动IP地址如下:")

    for ip in active_ip:

        print(ip)

    t2=time.time()

    print(t2-t1)